<?php

/**
 * Well Framework
 *
 * @package     Well
 * @subpackage  
 * 
 * @author    valerii lazarevych <valeriy.fremar@gmail.com>
 * @copyright Copyright(c) Fremar ltd.
 * 
 * @license   default
 * @version   4:31:44 PM | Feb 6, 2012
 */

/**
 * Well_Securiy Class
 * 
 * Provide site security methods
 * 
 * @package    Well
 * 
 * @copyright  Copyright(c) Fremar ltd.
 * @license    default
 */
class Well_Security 
{
    /**
     * Generate security code by random way
     * 
     * @param int $characters
     * @return string
     */
    private function generateCode($characters)
    {
        // list all possible characters, similar looking characters and vowels have been removed 
	$possible = '23456789bcdfghjkmnpqrstvwxyz';
	$code = '';
        $i = 0;
	
        while ($i < $characters) { 
            $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
            $i++;
	}
        
	return $code;
    }
    
    /**
     * Get captcha image
     * 
     * @param int $width       |   image width
     * @param int $height      |   image height
     * @param int $characters  |   characters number image have place
     * @return send http headers
     */
    static public function CaptchaImage($width='120',$height='40',$characters='6')
    {
        $font   =   '/fonts/monofont.ttf';		
        $code   =   $this->generateCode($characters);		                
        $_SESSION['security_code_adv'] = $code;
	
        // font size will be 75% of the image height 
	$font_size =    $height * 0.75;		
	$image     =    imagecreate($width, $height) or die('Cannot initialize new GD image stream');
	
        // set the colours 
	$background_color   =   imagecolorallocate($image, 255, 255, 255);
	$text_color         =   imagecolorallocate($image, 20, 40, 100);
	$noise_color        =   imagecolorallocate($image, 100, 120, 180);
	
        // generate random dots in background 
	for( $i=0; $i<($width*$height)/3; $i++ ) {
		imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color);
	}
	
        // generate random lines in background 
	for( $i=0; $i<($width*$height)/150; $i++ ) {
		imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color);
	}
	
        // create textbox and add text 
	$textbox    =   imagettfbbox($font_size, 0, $this->font, $_SESSION['security_code_adv']) or die('Error in imagettfbbox function');
        $x = ($width - $textbox[4])/2;
	$y = ($height - $textbox[5])/2;
	imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->font ,$_SESSION['security_code_adv']) or die('Error in imagettftext function');
		
	// output captcha image to browser 
	//while (@ob_end_clean());		
	imagejpeg($image);
	imagedestroy($image);
                
        header('Content-Type: image/jpeg');
        header('Cache-Control: no-cache');			
    }
}

